import CryptoJS from "crypto-js";
import moment from 'moment';
let AES = CryptoJS.AES;
let enc = CryptoJS.enc;
let AESKey = 'ax3c4545de4rt987';

/* export function encrypt(str) {
    return encodeURIComponent(AES.encrypt(str.toString(), AESKey).toString());
} */
export function encrypt(word) {
  var key = enc.Utf8.parse(AESKey);
  var srcs = enc.Utf8.parse(word);
  var encrypted = AES.encrypt(srcs, key, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
  });
  return encrypted.toString();
}

export function decrypt(str) {
  let result = "";
  try {
    let bytes = AES.decrypt(decodeURIComponent(str.toString()), AESKey);
    result = bytes.toString(enc.Utf8);
  } catch (e) {
    console.log("解密失败：", e);
  }
  return result;
}

export const regexp = {
  // url
  url: /^(https?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?$/,
  // 剔除 invite_code
  ignoreInvite: /^(?:(?!.*invite_code).*)/,
  // 邮箱
  email: /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.(?:com|cn)$/,
  // 时分秒
  timeString: /^(2[0-3]|[01]?[0-9]):([0-5]?[0-9]):([0-5]?[0-9])$/,
  // 日期
  dateString: /^(1[0-2]|0?[1-9])\/(3[01]|[12][0-9]|0?[1-9])\/(?:[0-9]{2})?[0-9]{2}$/,
  // 手机号码
  tel: /^1[3|4|5|6|7|8|9]\d{9}$/,
  // 座机号码
  phone: /\d{3}-?\d{8}|\d{4}-?\d{7}|^400|^800/,
  // 密码 6-20个大小写字母和数字
  password: /^[a-zA-Z0-9][a-zA-Z0-9]{5,19}$/,
  // 整数
  int: /^-?[0-9]\d*$/,
  // 正整数
  positiveInt: /^[1-9]\d*$/,
  // 大于2小于100
  group: /^([2-9]|[1-9][0-9]|100)$/,
  // 非负数
  nNegativeInt: /(^[1-9]\d*$)|0/,
  // 数字
  float: /^(-?\d+)(\.\d+)?$/,
  // 特殊字符
  odd: /[^\a-zA-Z0-9\u4e00-\u9FA5\-]/,
  // 金额
  money: /(^[1-9](\d{1,5})?(\.[0-9]{1,2})?$)|(^[0-9]\.[0-9]([0-9])?$)/,
  // 可为0金额
  zMoney: /(^[1-9](\d{1,7})?(\.[0-9]{1,2})?$)|(^[0-9]\.[0-9]([0-9])?$)|0/,
  // 比例
  percent: /^100$|^(\d|[1-9]\d)(\.[0-9]([0-9])?)*$/,
  // 排序值
  sort: /^(0|([1-9]\d{0,3}))$/,
  //大于0小于50000
  fiftyThousand: /^^(?:[1-9]\d{0,3}|1|50000|[1-4]\d{4})$/,
  // 大于0小于10000
  oneThousand: /^[1-9]\d{0,3}$|10000/,
  // 1-100正整数
  oneToHundred: /^([1-9]|[1-9]\d|100)$/,
  // 保留两位小数
  twoSmallNumber: /^([1-9]\d{0,5}|(0{1}))(\.\d{1,2})?$/,
};
//时间戳转时分秒

export function formatTimeStamp(timeStamp) {
  let days = parseInt(timeStamp / (1000 * 60 * 60 * 24));
  let hours = parseInt((timeStamp % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  let minutes = parseInt((timeStamp % (1000 * 60 * 60)) / (1000 * 60));
  let seconds = ((timeStamp % (1000 * 60)) / 1000).toFixed(0);
  days = days < 10 ? '0' + days : days
  hours = hours < 10 ? '0' + hours : hours
  minutes = minutes < 10 ? '0' + minutes : minutes
  seconds = seconds < 10 ? '0' + seconds : seconds

  return `${days}天${hours}时${minutes}分${seconds}秒`
}
/**
 * 将 date 转化为指定格式的String
 * 月(M)、日(d)、小时(h/H)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符
 * 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
 * formatDate(new Date(), 'YYYY-MM-DD hh:mm:ss.S') ==> 2006-07-02 08:09:04.423
 * formatDate(new Date(), 'yyyy-M-d h:m:s.S')      ==> 2006-7-2 8:9:4.18
 * @param date
 * @param fmt
 * @returns String
 */
export function formatDate(date, fmt = 'YYYY-MM-DD') {
  if (date) {
    let str = (moment(date).utcOffset(8)).format(fmt.replace(/-/g, '/'))
    if (fmt.match('-')) {
      return str.replace(/\//g, '-')
    }
    return str
  }
  return ''
  /*if (!date) {
      return '';
  }
  if (Object.prototype.toString.call(date) !== '[object Date]' || isNaN(date.getTime())) {
      date = new Date(date);
  }
  let o = {
      'M+': date.getMonth() + 1, //月份
      'd+': date.getDate(), //日
      'h+': date.getHours(), //小时
      'm+': date.getMinutes(), //分
      's+': date.getSeconds(), //秒
      'q+': Math.floor((date.getMonth() + 3) / 3), //季度
      'S': date.getMilliseconds() //毫秒
  };
  if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
  for (let k in o) {
      if (new RegExp('(' + k + ')').test(fmt)) {
          fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)));
      }
  }
  return fmt;*/
}
export function format(fmt) {
  function isZero(m) {
    return m < 10 ? '0' + m : m
  }
  if(fmt){
    //时间戳是整数，否则要parseInt转换
    var time = new Date(fmt); // 需要使用Date格式进行日期转化，若是时间戳、字符串时间，需要通过new Date(..)转化
    var y = time.getFullYear();
    var m = time.getMonth() + 1;
    var d = time.getDate();
    var h = time.getHours();
    var mm = time.getMinutes();
    var s = time.getSeconds();
    return y + '-' + isZero(m) + '-' + isZero(d) + ' ' + isZero(h) + ':' + isZero(mm) + ':' + isZero(s);
  } else {
    return ''
  }
}
// 判断是否为空
export function isEmpty(val) {
  if (typeof val === 'number') {
    return false;
  }
  if (val === null) {
    return true;
  }
  if (typeof val === 'undefined') {
    return true;
  }
  if (val.length === 0) {
    return true;
  }
  return !/[^(^\s*)|(\s*$)]/.test(val);
}

//是否为空
export function isNull(data) {
  if(data===null||data===undefined||data===''){
    return true;
  }else{
    return false;
  }
}

// 过滤对象的空值
export function filterEmptyKey(obj) {
  let rst = {};
  for (let k in obj) {
    if (obj[k]) {
      rst[k] = obj[k];
    }
  }
  return rst;
}

/**
 * 将平级结构转为嵌套结构
 * @param data
 * @param topPid
 * @param pidKeyName
 * @param idKeyName
 */
export function nestArray(data, topPid, pidKeyName, idKeyName) {
  let fa = function(pid) {
    let _array = [];
    for (let n of data) {
      if (n[pidKeyName] === pid) {
        n.children = fa(n[idKeyName]);
        _array.push(n);
      }
    }
    return _array;
  };
  return fa(topPid);
}

//防抖
export function debounce(fn, time=600) {
   let timeLock = null
   return function (...args){
       clearTimeout(timeLock)
       timeLock = setTimeout(()=>{
           fn(...args)
       },time)
   }
}

//节流
export function throttle(fn, time=600) {
   let flag = true;
   return function (...args){
     if(flag){
         flag = false;
         setTimeout(()=>{
             flag = true;
             fn(...args)
         },time)
     }
   }
}